全部
全部
更新时间:2023-08-22 13:53:55
功能接口调用

(1)使用请求报文body、签名密钥signature、时间戳ts(毫秒数),计算得出签名信息sign。

     

    签名规则:

     a.报文前拼接签名密钥,后面拼接时间戳(毫秒)字符串:signature + body + ts ;

          signature: 签名密钥;

          body: 请求JSON报文;

          ts: 时间戳,毫秒;

     b.使用SHA-256算法计算HASH值;


(2)使用产品token、签名信息sign、时间戳ts(毫秒数)、请求报文body,发出API调用请求,接口请求报文签名算法见下文

    

    HTTP 请求方式:

    POST

    

    HTTP URL

    https://openapi.unionpay.com/upapi/cardbin/cardinfo?token=[value]&sign=[value]&ts=[ts]

    

    HTTP 报文头(header):

    Content-Type: application/json

    X-OPEN-TOKEN:[token]

    X-OPEN-SIGN:[sign]

    X-OPEN-TS:[ts]


    HTTP 报文体body):

    JSON格式接口请求报文,如{"cardNo":""}


(3)API接口的请求参数、应答参数依据业务需求会配置校验规则或加解密规则,相关内容请参考《参数规则说明

报文签名样例代码

OAuth2.0认证方式报文签名规则-Java语言

/**
   * 签名算法
   *
   * @param body
   *            报文体
   * @param ts
   *            时间戳
   * @param signature
   *            密钥
   * @return
   */
  public static String sign(String body, String ts, String signature) {
      String sign = EncodeUtils.encodeBySHA256(signature + body + ts);
        return sign;
  }

 

 SHA256签名算法实现样例-Java语言

private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
 
/**
   * encode By SHA-256
   *
   * @param str
   * @return
   */
  public static String encodeBySHA256(String str) {
      if (str == null) {
          return null;
       }
      try {
          MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
          messageDigest.reset();
          messageDigest.update(str.getBytes("UTF-8"));
          return getFormattedText(messageDigest.digest());
      } catch (Exception e) {
          throw new RuntimeException(e);
      }
  }
 
/**
   * Takes the raw bytes from the digest and formats them correct.
   *
   * @param bytes
   *            the raw bytes from the digest.
   * @return the formatted bytes.
   */
  private static String getFormattedText(byte[] bytes) {
      int len = bytes.length;
      StringBuilder buf = new StringBuilder(len * 2);
      // 把密文转换成十六进制的字符串形式
      for (int j = 0; j < len; j++) {
          buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
          buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
      }

      return buf.toString();
  }


 

咨询服务